package pascal.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;


import pascal.excepcion.DAOExcepcion;
import pascal.modelo.Categoria;
import pascal.util.ConexionBD;

public class CategoriaDAO extends BaseDAO {

	public Collection<Categoria> buscarPorNombre(String Nombre)
			throws DAOExcepcion {
		String query = "select COD_CATEGORIA, STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA from categoria where STR_NOMBRE like ?"; //Like ? = Busca un parametro dentro de una cadena, el signo ? es igual a "Nombre" busca todos los nombres
		Collection<Categoria> lista = new ArrayList<Categoria>();
		Connection con = null; //Para conectarme a la BD, establecer la conexion
		PreparedStatement stmt = null; // Es para ejecutar la consulta "Select, delete, etc"
		ResultSet rs = null; // Para almacenar el resultado de la consulta "query"
				try { //Capturar de error, execpsiones
			con = ConexionBD.obtenerConexion(); // para obtener la cedana de conexion "Parametros del srv BD"
			stmt = con.prepareStatement(query); //Prepara los datos de la consulta. Es decir, que sentencia se ejecutara
			stmt.setString(1, "%" + Nombre + "%"); //Busca el parametro nombre al inico o fin de la cadena. "Jhonathan" y si es John te trae todo el nombre completo
			rs = stmt.executeQuery(); //ejecucion en si la consulta y se guarda en el rs (result set)
			while (rs.next()) { //correr el array en base a rs
				Categoria vo = new Categoria(); //Alamcen en vo de tipo categoria la tabla categoria
				vo.setCodCategoria(rs.getInt("COD_CATEGORIA")); // Llena en vo los datso de cada fila
				vo.setNombre(rs.getString("STR_NOMBRE"));  // Llena en vo los datso de cada fila
				vo.setDescripcion(rs.getString("STR_DESCRIPCION"));  // Llena en vo los datso de cada fila
             	vo.setCodRefCategoria(rs.getInt("COD_REF_CATEGORIA"));  // Llena en vo los datso de cada fila
			     
				lista.add(vo); //Todo lo que recolecta vo lo agrega a la lista por que l alista es de tipo categoria
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista; //retorno la lista ya llena con los datos
	}

	public Categoria insertarHijo(Categoria vo) throws DAOExcepcion {
		String query = "insert into categoria(STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA) values (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getDescripcion());
			stmt.setInt(3, vo.getCodRefCategoria());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setCodCategoria(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Categoria insertarPadre(Categoria vo) throws DAOExcepcion {
		String query = "insert into categoria(STR_NOMBRE, STR_DESCRIPCION) values (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getDescripcion());
			
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setCodCategoria(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	

	public Categoria obtener(int codCategoria) throws DAOExcepcion {
		Categoria vo = new Categoria();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select COD_CATEGORIA, STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA from categoria where COD_CATEGORIA =?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codCategoria);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodCategoria (rs.getInt(1));
				vo.setNombre (rs.getString(2));
				vo.setDescripcion(rs.getString(3));
				vo.setCodRefCategoria (rs.getInt(4));

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int codCategoria) throws DAOExcepcion {
		String query = "delete from categoria WHERE COD_CATEGORIA =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codCategoria);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Categoria actualizarHijo(Categoria vo) throws DAOExcepcion {
		String query = "update categoria set STR_NOMBRE =?, STR_DESCRIPCION =?, COD_REF_CATEGORIA=? where COD_CATEGORIA =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre ());
			stmt.setString(2, vo.getDescripcion ());
			stmt.setInt(3, vo.getCodCategoria ());
			stmt.setInt(4, vo.getCodRefCategoria ());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	
	public Categoria actualizarPadre(Categoria vo) throws DAOExcepcion {
		String query = "update categoria set STR_NOMBRE =?, STR_DESCRIPCION =? where COD_CATEGORIA =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre ());
			stmt.setString(2, vo.getDescripcion ());
			stmt.setInt(3, vo.getCodCategoria ());
			//stmt.setInt(4, vo.getCodRefCategoria ());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Categoria> listar() throws DAOExcepcion {
		Collection<Categoria> c = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select COD_CATEGORIA, STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA from categoria order by COD_REF_CATEGORIA,STR_NOMBRE";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setCodCategoria(rs.getInt("COD_CATEGORIA"));
				vo.setNombre(rs.getString("STR_NOMBRE"));
				vo.setDescripcion(rs.getString("STR_DESCRIPCION"));
				vo.setCodRefCategoria(rs.getInt("COD_REF_CATEGORIA"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<Categoria> listarPadre() throws DAOExcepcion {
		Collection<Categoria> c = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select COD_CATEGORIA, STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA from categoria where COD_REF_CATEGORIA is null order by STR_NOMBRE";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setCodCategoria(rs.getInt("COD_CATEGORIA"));
				vo.setNombre(rs.getString("STR_NOMBRE"));
				vo.setDescripcion(rs.getString("STR_DESCRIPCION"));
				vo.setCodRefCategoria(rs.getInt("COD_REF_CATEGORIA"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Categoria> listarHijos(int codigo) throws DAOExcepcion {
		Collection<Categoria> c = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select COD_CATEGORIA, STR_NOMBRE, STR_DESCRIPCION, COD_REF_CATEGORIA from categoria where COD_REF_CATEGORIA = ? order by STR_NOMBRE";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setCodCategoria(rs.getInt("COD_CATEGORIA"));
				vo.setNombre(rs.getString("STR_NOMBRE"));
				vo.setDescripcion(rs.getString("STR_DESCRIPCION"));
				vo.setCodRefCategoria(rs.getInt("COD_REF_CATEGORIA"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	
	//Para obtener el nombre de la categoria
	public Collection<Categoria> buscarNombre(String nombre) throws DAOExcepcion {
		String query = "select  STR_NOMBRE from categoria where STR_NOMBRE = ?";
		Collection<Categoria> lista = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1,  nombre ); // revisar
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setNombre(nombre);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		//System.out.println(lista.size());
		return lista;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
